package com.smart.community.commons.result;

import lombok.Getter;

/**
 * 响应状态码枚举类
 * 定义系统中所有响应状态码
 * @author Wu.Liang
 * @since 2024-12-19
 * @version 1.0.0
 */
@Getter
public enum ResultCode {
    
    // ========================= 成功状态码 =========================
    /**
     * 操作成功
     */
    SUCCESS(200, "操作成功"),
    
    /**
     * 创建成功
     */
    CREATED(201, "创建成功"),
    
    /**
     * 更新成功
     */
    UPDATED(202, "更新成功"),
    
    /**
     * 删除成功
     */
    DELETED(203, "删除成功"),
    
    // ========================= 客户端错误状态码 =========================
    /**
     * 请求参数错误
     */
    BAD_REQUEST(400, "请求参数错误"),
    
    /**
     * 未授权
     */
    UNAUTHORIZED(401, "未授权"),
    
    /**
     * 禁止访问
     */
    FORBIDDEN(403, "禁止访问"),
    
    /**
     * 资源不存在
     */
    NOT_FOUND(404, "资源不存在"),
    
    /**
     * 请求方法不允许
     */
    METHOD_NOT_ALLOWED(405, "请求方法不允许"),
    
    /**
     * 请求超时
     */
    REQUEST_TIMEOUT(408, "请求超时"),
    
    /**
     * 请求冲突
     */
    CONFLICT(409, "请求冲突"),
    
    /**
     * 请求范围不满足
     */
    RANGE_NOT_SATISFIABLE(416, "请求范围不满足"),
    
    /**
     * 期望失败
     */
    EXPECTATION_FAILED(417, "期望失败"),
    
    /**
     * 请求参数验证失败
     */
    VALIDATION_FAILED(422, "请求参数验证失败"),
    
    /**
     * 请求实体过大
     */
    PAYLOAD_TOO_LARGE(413, "请求实体过大"),
    
    /**
     * 请求URI过长
     */
    URI_TOO_LONG(414, "请求URI过长"),
    
    /**
     * 不支持的媒体类型
     */
    UNSUPPORTED_MEDIA_TYPE(415, "不支持的媒体类型"),
    
    /**
     * 请求过于频繁
     */
    TOO_MANY_REQUESTS(429, "请求过于频繁"),
    
    /**
     * 参数错误
     */
    PARAM_ERROR(430, "参数错误"),
    
    /**
     * 操作失败
     */
    OPERATION_FAILED(431, "操作失败"),
    
    // ========================= 服务器错误状态码 =========================
    /**
     * 服务器内部错误
     */
    INTERNAL_SERVER_ERROR(500, "服务器内部错误"),
    
    /**
     * 服务不可用
     */
    SERVICE_UNAVAILABLE(503, "服务不可用"),
    
    /**
     * 网关超时
     */
    GATEWAY_TIMEOUT(504, "网关超时"),
    
    /**
     * HTTP版本不支持
     */
    HTTP_VERSION_NOT_SUPPORTED(505, "HTTP版本不支持"),
    
    // ========================= 业务错误状态码 =========================
    /**
     * 数据不存在
     */
    DATA_NOT_FOUND(1001, "数据不存在"),
    
    /**
     * 数据已存在
     */
    DATA_ALREADY_EXISTS(1002, "数据已存在"),
    
    /**
     * 数据状态错误
     */
    DATA_STATUS_ERROR(1003, "数据状态错误"),
    
    /**
     * 权限不足
     */
    PERMISSION_DENIED(1004, "权限不足"),
    
    /**
     * 用户未登录
     */
    USER_NOT_LOGIN(1005, "用户未登录"),
    
    /**
     * 用户已存在
     */
    USER_ALREADY_EXISTS(1006, "用户已存在"),
    
    /**
     * 用户名或密码错误
     */
    USERNAME_OR_PASSWORD_ERROR(1007, "用户名或密码错误"),
    
    /**
     * 用户被禁用
     */
    USER_DISABLED(1008, "用户被禁用"),
    
    /**
     * 用户被锁定
     */
    USER_LOCKED(1009, "用户被锁定"),
    
    /**
     * 验证码错误
     */
    CAPTCHA_ERROR(1010, "验证码错误"),
    
    /**
     * 验证码已过期
     */
    CAPTCHA_EXPIRED(1011, "验证码已过期"),
    
    /**
     * 短信验证码错误
     */
    SMS_CODE_ERROR(1012, "短信验证码错误"),
    
    /**
     * 短信验证码已过期
     */
    SMS_CODE_EXPIRED(1013, "短信验证码已过期"),
    
    /**
     * 邮箱验证码错误
     */
    EMAIL_CODE_ERROR(1014, "邮箱验证码错误"),
    
    /**
     * 邮箱验证码已过期
     */
    EMAIL_CODE_EXPIRED(1015, "邮箱验证码已过期"),
    
    /**
     * 文件上传失败
     */
    FILE_UPLOAD_ERROR(1016, "文件上传失败"),
    
    /**
     * 文件格式不支持
     */
    FILE_FORMAT_NOT_SUPPORTED(1017, "文件格式不支持"),
    
    /**
     * 文件大小超限
     */
    FILE_SIZE_EXCEEDED(1018, "文件大小超限"),
    
    /**
     * 数据库操作失败
     */
    DATABASE_ERROR(1019, "数据库操作失败"),
    
    /**
     * 缓存操作失败
     */
    CACHE_ERROR(1020, "缓存操作失败"),
    
    /**
     * 网络请求失败
     */
    NETWORK_ERROR(1021, "网络请求失败"),
    
    /**
     * 第三方服务调用失败
     */
    THIRD_PARTY_SERVICE_ERROR(1022, "第三方服务调用失败"),
    
    /**
     * 系统配置错误
     */
    CONFIG_ERROR(1023, "系统配置错误"),
    
    /**
     * 系统维护中
     */
    SYSTEM_MAINTENANCE(1024, "系统维护中"),
    
    /**
     * 操作过于频繁
     */
    OPERATION_TOO_FREQUENT(1025, "操作过于频繁"),
    
    /**
     * 数据格式错误
     */
    DATA_FORMAT_ERROR(1026, "数据格式错误"),
    
    /**
     * 数据完整性错误
     */
    DATA_INTEGRITY_ERROR(1027, "数据完整性错误"),
    
    /**
     * 业务规则违反
     */
    BUSINESS_RULE_VIOLATION(1028, "业务规则违反"),
    
    /**
     * 工作流状态错误
     */
    WORKFLOW_STATUS_ERROR(1029, "工作流状态错误"),
    
    /**
     * 审批流程错误
     */
    APPROVAL_PROCESS_ERROR(1030, "审批流程错误"),
    
    /**
     * 业务异常
     */
    BUSINESS_ERROR(1000, "业务异常");
    
    private final int code;
    private final String message;
    
    /**
     * 构造函数
     * 
     * @param code 状态码
     * @param message 状态消息
     */
    ResultCode(int code, String message) {
        this.code = code;
        this.message = message;
    }
    
    /**
     * 获取状态码
     * 
     * @return 状态码
     */
    public int getCode() {
        return code;
    }
    
    /**
     * 获取状态消息
     * 
     * @return 状态消息
     */
    public String getMessage() {
        return message;
    }
    
    /**
     * 判断是否为成功状态码
     * 
     * @param code 状态码
     * @return 是否为成功状态码
     */
    public static boolean isSuccess(int code) {
        return code >= 200 && code < 300;
    }
    
    /**
     * 判断是否为客户端错误状态码
     * 
     * @param code 状态码
     * @return 是否为客户端错误状态码
     */
    public static boolean isClientError(int code) {
        return code >= 400 && code < 500;
    }
    
    /**
     * 判断是否为服务器错误状态码
     * 
     * @param code 状态码
     * @return 是否为服务器错误状态码
     */
    public static boolean isServerError(int code) {
        return code >= 500 && code < 600;
    }
    
    /**
     * 根据状态码获取枚举
     * 
     * @param code 状态码
     * @return 枚举值
     */
    public static ResultCode getByCode(int code) {
        for (ResultCode resultCode : values()) {
            if (resultCode.getCode() == code) {
                return resultCode;
            }
        }
        return null;
    }
}
